global calcular_longitud_codificacion
;int calcular_longitud_codificacion ( unsigned int *tabla_apariciones,codigo_t *tabla_codigo )

extern printf

%define p_apariciones ebp+8
%define p_codigo ebp+12 

%define offset_codigo 0
%define offset_codigo_rev 4
%define offset_long_codigo 8
%define offset_valido 12

section .data

overflow: db 'ERROR: La codificacion a generar es demasiado extensa',10,0


section .text

calcular_longitud_codificacion:

	;enter 0,0	; comentado para probar con valgrind
	push ebp	
	mov ebp,esp
	
	push ebx
	push esi
	push edi
	
	mov esi,[p_codigo] ; el primer elemento de la tabla de codigo
	mov edi,[p_apariciones]
	
	xor ebx, ebx; en ebx  longitud final
	xor eax, eax; retornaremos en valor por eax
	
	mov ecx,256
_ciclo:
	xor edx, edx; lo usaremos para verificar si pasa los 32 bits
	mov eax, [edi]
	cmp eax,0
	je _loop
	
	mul dword [esi+offset_long_codigo]	
	cmp edx,0
	jne _overflow  ; la multiplicacion supero los 32 bits 
	
	add ebx, eax
	
	jc _overflow  ; la multiplicacion supero los 32 bits 
	
_loop:

	add esi, 16
	add edi, 4
	
	loop _ciclo

	mov eax, ebx
	jmp fin

_overflow:	
	push overflow
	call printf
	add esp,4
	
	mov eax,-1

fin:
	
	pop edi
	pop esi
	pop ebx
	leave
	ret
	









